;;; init lib
(ql:quickload "cffi")
(ql:quickload "cl-mysql")

;;; def package
(defpackage :mypro
  (:use :common-lisp :cl-mysql :cl-mysql-system))
(use-package :mypro)

;;;connect to mysql
(connect :host "localhost" :user "root" :password "root")

(defun dbs ()
  (query "show databases"))
(defun dbs-print ()
  (dolist
      (x (caar (dbs)))
    (print (car x))))

(defun tables (db)
  (query (concatenate 'string "use " db))
  (query "show tables"))

;;;此方法与dbs-print雷同，应该去掉
;;;这里的不同的地方是 调用获取数据的方法和传入参数
;;;tables对应着dbs   db对应着(没有参数)
(defun tables-print (db)
  (dolist (x (caar (tables db)))
    (print (car x))))

;;; 可以用lisp做一个该程序的解释器，不导入默认的包? 让我可以在repl动态操作
;;;接下可以一个命令行版本mysql数据读取器
;;;对表格查询条件，切换表格会保留下来，支持将当前状态保存，方便下次使用
;;;每次还打印当前sql环境设置,支持对表进行别名操作(临时)
;;;比方说操作的方式
;;; (set-db "db1")  ###查询数据库db1 其实就是use db1
;;; (set-tb "tb1")  ###查询表tb1  用一个变量记录当前表格
;;; (get "*")       ###设置需要拿什么字段
;;; (where "id=1"   ###where条件
;;; (show)          ###返回结果
;;; (clear where)   ###清楚where
;;; (clear all)     ###清楚所有
;;; (sel-alias "product" "t") ###设置别名,防止别名重复，做一个搜索tbname是否和别名匹配的函数就可，添加的时候判断一下
;;;当前sql环境设置打印：如
;;; db      : xxx
;;; table   : xxx
;;; where   : a=1 | b=3 | c>0
;;; order by: id desc

;;;或者另一种查询方式
tables: tb1 | tb2 | tb3| tb4 | tb5 | tb6 | ##提示有什么表
from> tb-pro  #从那个表查询
get> id name qq#取什么数据              ;
where> id=1 name like qq | name=afd a<11
(get "id name qq" :where "qq=1 sdf like %abc% a>0")
